interface StorageItem<T> {
  value: T;
  expires?: number; // 过期时间戳（毫秒）
}

class CustomStorage {
  private storage: { [key: string]: StorageItem<any> | null } = {};

  /**
   * 设置项
   * @param key 键
   * @param value 值
   * @param ttl 过期时间（秒），可选
   */
  public setItem(key: string, value: any, ttl?: number) {
    const expires = ttl ? Date.now() + ttl * 1000 : undefined;
    this.storage[key] = { value, expires };

    // 将当前项存储到localStorage（注意：这里只存储当前项，不是整个storage对象）
    localStorage.setItem(key, JSON.stringify({ value, expires }));
  }

  /**
   * 获取项
   * @param key 键
   * @returns 值或null（如果项不存在或已过期）
   */
  public getItem<T = string>(key: string): null | T {
    // 尝试从localStorage获取项
    const itemString = localStorage.getItem(key);
    if (!itemString) {
      return null;
    }

    const item: StorageItem<T> = JSON.parse(itemString);

    // 如果过期，从localStorage和内部存储中删除
    if (item.expires && Date.now() > item.expires) {
      localStorage.removeItem(key);
      delete this.storage[key];
      return null;
    }
    return item.value;
  }

  /**
   * 删除缓存
   * @param key 缓存KEY
   */
  public remove(key: string) {
    localStorage.removeItem(key);
  }

  /**
   * 清除所有项
   */
  public clear() {
    Object.keys(this.storage).forEach((key) => {
      localStorage.removeItem(key);
      delete this.storage[key];
    });
  }
}

export default new CustomStorage();
